/*
 * @Author: 0x9DEFA478
 * @Date: 2025-05-06 20:37:28
 * @LastEditTime: 2025-05-28 23:43:00
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * 
 */
#ifndef hH_StringFormat_H_
#define hH_StringFormat_H_
#include "H_Type.h"
#include <stdarg.h>
#ifdef __cplusplus
extern "C"{
#endif




typedef struct sH_StringFormat_CharOutput                         H_StringFormat_CharOutput;
typedef int (*H_StringFormat_CharOutput_Callback_t)(H_StringFormat_CharOutput*,char);
struct sH_StringFormat_CharOutput{
  H_StringFormat_CharOutput_Callback_t Output;// IsEnd (this,c)
};




/**
 * format 标签属性 %[flags][width][.precision][length]specifier
 * 
 * specifier:
 *            a,A  : 以十六进制形式输出浮点数
 *            d    : 以十进制形式输出带符号整数
 *            o    : 以八进制形式输出带符号整数
 *            x,X  : 以十六进制形式输出无符号整数
 *            u    : 以十进制形式输出无符号整数
 *            f    : 以小数形式输出单、双精度实数
 *            e,E  : 以指数形式输出单、双精度实数
 *            g,G  : 以%f或%e中较短的输出宽度输出单、双精度实数
 *            c    : 输出单个字符
 *            s    : 输出字符串
 *            p    : 输出指针地址
 * 
 * flags
 *            -    : 在给定的字段宽度内左对齐
 *            +    : 强制在结果之前显示加号或减号
 *            空格  : 如果没有写入任何符号，则在该值前面插入一个空格
 *            #    : 与 o、x 或 X 说明符一起使用时，非零值前面会分别显示 0、0x 或 0X
 *                   与 e、E 和 f 一起使用时，会强制输出包含一个小数点，即使后边没有数字时也会显示小数点。默认情况下，如果后边没有数字时候，不会显示显示小数点。
 *            0    : 在指定填充 padding 的数字左边放置0，而不是空格
 * 
 * width
 *            (number) : 要输出的字符的最小数目。如果输出的值短于该数，结果会用空格填充。如果输出的值长于该数，结果不会被截断。
 *            *        : 宽度在 format 字符串中未指定，但是会作为附加整数值参数放置于要被格式化的参数之前
 * 
 * .precision
 *            .number : 对于整数说明符（d、i、o、u、x、X）：precision 指定了要写入的数字的最小位数。如果写入的值短于该数，结果会用前导零来填充。如果写入的值长于该数，结果不会被截断。精度为 0 意味着不写入任何字符。
 *                      对于 e、E 和 f 说明符：要在小数点后输出的小数位数。
 *                      对于 g 和 G 说明符：要输出的最大有效位数。
 *                      对于 s: 要输出的最大字符数。默认情况下，所有字符都会被输出，直到遇到末尾的空字符。
 *                      对于 c 类型：没有任何影响。
 *                      如果指定时不带有一个显式值，则假定为 0。
 *            .*      : 精度在 format 字符串中未指定，但是会作为附加整数值参数放置于要被格式化的参数之前。
 * 
 * length
 *            h    : 参数被解释为短整型或无符号短整型（仅适用于整数说明符：d、o、u、x 和 X）。
 *            l    : 参数被解释为长整型或无符号长整型，适用于整数说明符（d、o、u、x 和 X）及说明符 c（表示一个宽字符）和 s（表示宽字符字符串）。
 *                   作用于浮点时, H_StringFormat内部将不会转为单精度后处理
 *            ll   : 长长整形
 *            L    : long double
 * 
 */


/**
 * @brief 格式化字符串到输出
 * @param CharOutput 字符输出对象
 * @param Format 格式 与sprintf()的格式化字符串一致
 * @param Params 参数
 * @return 输出的字符长度
 */
Hsize H_StringFormat(H_StringFormat_CharOutput* CharOutput,const char* Format,va_list* Params);




#ifdef __cplusplus
}
#endif
#endif //hH_StringFormat_H_
